package cn.agiledata.bank.linkbank.impl.ceb;

import java.util.HashMap;
import java.util.Map;

import com.csii.payment.client.core.CebMerchantSignVerify;
import cn.agiledata.bank.linkbank.exception.LinkBankException;

/**
 * 光大银行网上银行通用类
 * 
 * @author 马贤波
 * 
 */
class CebNetPayUtils {

    /**
     * 按照光大银行生成支付请求数字签名的规则拼凑加密内容
     * 
     * @param values
     *            所有参数
     * @param keys
     *            参与校验的顺序相关的关键字组
     *            
     * @return 拼凑好的加密内容
     */
    public static String map2String(Map values, String[] keys) {
        String content = "";
        for (int i = 0; i < keys.length; i++) {
        	if(i > 0) {
        		// 每个元素之间使用~|~分隔
        		content += "~|~";
        	}
        	String strValue = (String)values.get(keys[i]);
        	if(strValue == null) {
        		strValue = "";
        	}
            content += keys[i] + "=" + strValue;
        }
        return content;
    }

    /**
	 * 把由“~|~”分隔的交易数据转换成Map，然后可根据key取得value
	 * @see Map 
	 */
	public static Map string2map(String dataStr) {
		
		if(dataStr == null || dataStr.length() == 0)
			return null;
			
		Map retMap = new HashMap();
			
		String[] terms =  dataStr.split("~\\|~");		
		int len = terms.length;
		
		for(int i = 0; i < len; i++) {
			String term = terms[i];
			int index = term.indexOf("=");
			retMap.put(term.substring(0, index), term.substring(index+1));
		}
		
		return retMap;
	}

    /**
     * 按照光大银行支付请求数字签名的规则生成数字签名
     * 
     * @param values
     *            所有参数
     * @param keys
     *            参与校验的顺序相关的关键字组
     * @return 数字签名
     * @throws LinkBankException
     */
    public static String getDigitalSign(Map values, String[] keys)
            throws LinkBankException {
        try {
        	// 取得加密明文
            String content = map2String(values, keys);
            String strSign = CebMerchantSignVerify.merchantSignData_ABA(content);

            return strSign;
        } catch (Exception e) {
            throw LinkBankException.CANNOT_LOAD_CERT;
        }
    }

    /**
     * 按照光大银行支付响应数字签名的规则校验数字签名
     * 
     * @param digitalSign	返回的数字签名
     * @param plain			签名明文
     * @return
     * @throws LinkBankException
     */
    public static boolean validateDigitalSign(String digitalSign, String plain)
            throws LinkBankException {
        try {
        	// 校验返回签名
        	return CebMerchantSignVerify.merchantVerifyPayGate_ABA(digitalSign,
					plain);
        } catch (Exception e) {
            throw LinkBankException.CANNOT_LOAD_CERT;
        }
    }
    
	/**
	 * 模仿oracle NVL()函数，若输入参数input为空(null)，则把它转换为空字符串""
	 */
	public static String nvl(String input) {
		
		if(input == null)
			input = "";			
		return input;
	}
}
